package co.edu.usbcali.sap.modelo.control;

import co.edu.usbcali.sap.dataaccess.daoFactory.XMLHibernateDaoFactory;
import co.edu.usbcali.sap.dataaccess.sessionFactory.HibernateSessionFactory;
import co.edu.usbcali.sap.exceptions.*;
import co.edu.usbcali.sap.exceptions.ZMessManager.FindingException;
import co.edu.usbcali.sap.modelo.*;
import co.edu.usbcali.sap.modelo.dto.LineaInvestigacionDTO;
import co.edu.usbcali.sap.modelo.dto.PersonaDTO;
import co.edu.usbcali.sap.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.sap.utilities.FacesUtils;
import co.edu.usbcali.sap.utilities.Utilities;

import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * interface ProyectoLogic
 * 
 * @author Zathura Code Generator http://code.google.com/p/zathura
 * 
 */
public class ProyectoLogic implements IProyectoLogic {
	public List<Proyecto> getProyecto() throws Exception {
		List<Proyecto> list = new ArrayList<Proyecto>();

		try {
			list = XMLHibernateDaoFactory.getInstance().getProyectoDAO()
					.findAll();
		} catch (Exception e) {
			throw new ZMessManager().new GettingException(ZMessManager.ALL
					+ "Proyecto");
		} finally {
		}

		return list;
	}

	public void saveProyecto(Integer proCodigo, Date proFechafin,
			Date proFechainicio, String proNombre, String proTemaproyecto,
			Integer comCodigo_Comite, Integer estCodigo_Estado,
			Integer fasproCodigo_FaseProyecto,
			Integer tipproCodigo_TipoProyecto, List<PersonaDTO> integrantes,
			List<PersonaDTO> directores) throws Exception {
		Proyecto entity = null;

		try {
			if (proCodigo == null) {
				throw new ZMessManager().new EmptyFieldException("Codigo");
			}

			if (proFechainicio == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Fecha de inicio");
			}

			if (proNombre == null) {
				throw new ZMessManager().new EmptyFieldException("Nombre");
			}

			if ((proNombre != null)
					&& (Utilities.checkWordAndCheckWithlength(proNombre, 80) == false)) {
				throw new ZMessManager().new NotValidFormatException("Nombre");
			}

			if (proTemaproyecto == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Tema proyecto");
			}

			if ((proTemaproyecto != null)
					&& (Utilities.checkWordAndCheckWithlength(proTemaproyecto,
							200) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"Tema proyecto");
			}

			if (comCodigo_Comite == null) {
				throw new ZMessManager().new EmptyFieldException(
						"comCodigo_Comite");
			}

			if (estCodigo_Estado == null) {
				throw new ZMessManager().new EmptyFieldException(
						"estCodigo_Estado");
			}

			if (fasproCodigo_FaseProyecto == null) {
				throw new ZMessManager().new EmptyFieldException(
						"fasproCodigo_FaseProyecto");
			}

			if (tipproCodigo_TipoProyecto == null) {
				throw new ZMessManager().new EmptyFieldException(
						"tipproCodigo_TipoProyecto");
			}

			IComiteLogic logicComite1 = new ComiteLogic();
			IEstadoLogic logicEstado2 = new EstadoLogic();
			IFaseProyectoLogic logicFaseProyecto3 = new FaseProyectoLogic();
			ITipoProyectoLogic logicTipoProyecto4 = new TipoProyectoLogic();
			Comite comiteClass = logicComite1.getComite(comCodigo_Comite);
			Estado estadoClass = logicEstado2.getEstado(estCodigo_Estado);
			FaseProyecto faseProyectoClass = logicFaseProyecto3
					.getFaseProyecto(fasproCodigo_FaseProyecto);
			TipoProyecto tipoProyectoClass = logicTipoProyecto4
					.getTipoProyecto(tipproCodigo_TipoProyecto);

			if (comiteClass == null) {
				throw new ZMessManager().new ForeignException("comite");
			}

			if (estadoClass == null) {
				throw new ZMessManager().new ForeignException("estado");
			}

			if (faseProyectoClass == null) {
				throw new ZMessManager().new ForeignException("fase Proyecto");
			}

			if (tipoProyectoClass == null) {
				throw new ZMessManager().new ForeignException("tipo Proyecto");
			}

			entity = getProyecto(proCodigo);

			if (entity != null) {
				throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
			}

			entity = new Proyecto();
			entity.setProCodigo(proCodigo);
			entity.setProFechafin(proFechafin);
			entity.setProFechainicio(proFechainicio);
			entity.setProNombre(proNombre);
			entity.setProTemaproyecto(proTemaproyecto);
			entity.setComite(comiteClass);
			entity.setEstado(estadoClass);
			entity.setFaseProyecto(faseProyectoClass);
			entity.setTipoProyecto(tipoProyectoClass);
			// entity.setProyecto(proyecto);
			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getProyectoDAO().save(entity);
			/*
			 * for (Persona persona : directores) { IProyectoPersonaRolLogic
			 * logic = new ProyectoPersonaRolLogic();
			 * //logic.saveProyectoPersonaRol(persona.getPerCodigo(), 2,
			 * tipproCodigo_TipoProyecto, perCodigo_Persona, proCodigo_Proyecto,
			 * rolCodigo_Rol) }
			 */
			HibernateSessionFactory.commit();
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	public void saveProyecto2(Integer proCodigo, Date proFechafin,
			Date proFechainicio, String proNombre, String proTemaproyecto,
			List<PersonaDTO> integrantes, List<PersonaDTO> directores,
			Integer estCodigo, Integer faseCodigo, Integer tipo,
			Integer codigo, List<LineaInvestigacionDTO> linea) throws Exception {
		Proyecto entity = null;

		try {
			if (proCodigo == null) {
				throw new ZMessManager().new EmptyFieldException("Codigo");
			}

			if (proFechainicio == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Fecha de inicio");
			}

			if (proNombre == null) {
				throw new ZMessManager().new EmptyFieldException("Nombre");
			}

			if ((proNombre != null)
					&& (Utilities.checkWordAndCheckWithlength(proNombre, 80) == false)) {
				throw new ZMessManager().new NotValidFormatException("Nombre");
			}

			if (proTemaproyecto == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Tema proyecto");
			}
			if (estCodigo == null) {
				throw new ZMessManager().new EmptyFieldException("Estado");
			}
			if (faseCodigo == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Fase proyecto");
			}

			if ((proTemaproyecto != null)
					&& (Utilities.checkWordAndCheckWithlength(proTemaproyecto,
							200) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"Tema proyecto");
			}
			entity = getProyectoNombre(proNombre);
			if (entity != null) {
				throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
			}
			IEstadoLogic estadoLogic = new EstadoLogic();
			IFaseProyectoLogic faseProyectoLogic = new FaseProyectoLogic();
			ITipoProyectoLogic iTipoProyectoLogic = new TipoProyectoLogic();
			Estado estado = estadoLogic.getEstado(estCodigo);
			if (estado == null) {
				FacesUtils.addErrorMessage("El estado no existe");
			}
			FaseProyecto faseProyecto = faseProyectoLogic
					.getFaseProyecto(faseCodigo);
			if (faseProyecto == null) {
				FacesUtils.addErrorMessage("La fase Proyecto no existe");
			}
			TipoProyecto proyecto = iTipoProyectoLogic.getTipoProyecto(tipo);
			if (proyecto == null) {
				FacesUtils.addErrorMessage("El tipo proyecto no existe");
			}

			Proyecto proyecto4 = null;
			if (codigo != 0) {
				proyecto4 = getProyecto(codigo);
			}
			entity = new Proyecto();
			entity.setEstado(estado);
			entity.setFaseProyecto(faseProyecto);
			entity.setTipoProyecto(proyecto);
			entity.setProCodigo(proCodigo);
			entity.setProFechafin(proFechafin);
			entity.setProFechainicio(proFechainicio);
			entity.setProNombre(proNombre);
			entity.setProTemaproyecto(proTemaproyecto);
			entity.setProyecto(proyecto4);
			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getProyectoDAO().save(entity);
			HibernateSessionFactory.flush();
			for (PersonaDTO personaDTO : directores) {
				IProyectoPersonaRolLogic logic = new ProyectoPersonaRolLogic();
				IPersonaLogic iPersonaLogic = new PersonaLogic();
				Persona persona = iPersonaLogic.getPersona(Integer
						.parseInt(personaDTO.getPerCodigo()));
				entity = getProyectoNombre(proNombre);
				IRolLogic logic2 = new RolLogic();
				Rol rol = logic2.getRol(4);
				ProyectoPersonaRolId idClass = new ProyectoPersonaRolId();
				idClass.setPerCodigo(persona.getPerCodigo());
				idClass.setRolCodigo(rol.getRolCodigo());
				idClass.setProCodigo(entity.getProCodigo());
				ProyectoPersonaRol entity2 = null;
				entity2 = logic.getProyectoPersonaRol(idClass);

				if (entity2 != null) {
					throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
				}

				entity2 = new ProyectoPersonaRol();
				entity2.setId(idClass);
				entity2.setPersona(persona);
				entity2.setProyecto(entity);
				entity2.setRol(rol);
				HibernateSessionFactory.beginTransaction();
				XMLHibernateDaoFactory.getInstance().getProyectoPersonaRolDAO()
						.save(entity2);

			}
			for (PersonaDTO personaDTO : integrantes) {
				IProyectoPersonaRolLogic logic = new ProyectoPersonaRolLogic();
				IPersonaLogic iPersonaLogic = new PersonaLogic();
				Persona persona = iPersonaLogic.getPersona(Integer
						.parseInt(personaDTO.getPerCodigo()));
				entity = getProyectoNombre(proNombre);
				IRolLogic logic2 = new RolLogic();
				Rol rol = logic2.getRol(1);
				ProyectoPersonaRolId idClass = new ProyectoPersonaRolId();
				idClass.setPerCodigo(persona.getPerCodigo());
				idClass.setRolCodigo(rol.getRolCodigo());
				idClass.setProCodigo(entity.getProCodigo());
				ProyectoPersonaRol entity2 = null;
				entity2 = logic.getProyectoPersonaRol(idClass);

				if (entity2 != null) {
					throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
				}

				entity2 = new ProyectoPersonaRol();
				entity2.setId(idClass);
				entity2.setPersona(persona);
				entity2.setProyecto(entity);
				entity2.setRol(rol);
				HibernateSessionFactory.beginTransaction();
				XMLHibernateDaoFactory.getInstance().getProyectoPersonaRolDAO()
						.save(entity2);

			}
			for (LineaInvestigacionDTO lineaDTO : linea) {
				IProyectoLineaLogic lineaLogic = new ProyectoLineaLogic();
				ILineaInvestigacionLogic iPersonaLogic = new LineaInvestigacionLogic();
				LineaInvestigacion persona = iPersonaLogic
						.getLineaInvestigacion(Integer.parseInt(lineaDTO
								.getLininCodigo()));
				entity = getProyectoNombre(proNombre);
				ProyectoLineaId idClass = new ProyectoLineaId();
				idClass.setProCodigo(entity.getProCodigo());
				idClass.setLininCodigo(persona.getLininCodigo());
				ProyectoLinea entity2 = null;
				entity2 = lineaLogic.getProyectoLinea(idClass);

				if (entity2 != null) {
					throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
				}

				entity2 = new ProyectoLinea();
				entity2.setId(idClass);
				HibernateSessionFactory.beginTransaction();
				XMLHibernateDaoFactory.getInstance().getProyectoLineaDAO()
						.save(entity2);

			}
			HibernateSessionFactory.commit();
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	public void deleteProyecto(Integer proCodigo) throws Exception {
		Proyecto entity = null;

		if (proCodigo == null) {
			throw new ZMessManager().new EmptyFieldException("proCodigo");
		}

		List<ActaSeguimientoProyectoGrado> actaSeguimientoProyectoGrados = null;
		List<AprobacionAnteproyecto> aprobacionAnteproyectos = null;
		List<DocumentosProyecto> documentosProyectos = null;
		List<ProyectoPersonaRol> proyectoPersonaRols = null;
		List<ReciboProyectoGrado> reciboProyectoGrados = null;
		List<RevisionProyectoGrado> revisionProyectoGrados = null;
		entity = getProyecto(proCodigo);

		if (entity == null) {
			throw new ZMessManager().new EmptyFieldException("Proyecto");
		}

		try {
			actaSeguimientoProyectoGrados = XMLHibernateDaoFactory
					.getInstance().getActaSeguimientoProyectoGradoDAO()
					.findByProperty("proyecto.proCodigo", proCodigo);

			if (Utilities.validationsList(actaSeguimientoProyectoGrados) == true) {
				throw new ZMessManager().new DeletingException(
						"actaSeguimientoProyectoGrados");
			}

			aprobacionAnteproyectos = XMLHibernateDaoFactory.getInstance()
					.getAprobacionAnteproyectoDAO().findByProperty(
							"proyecto.proCodigo", proCodigo);

			if (Utilities.validationsList(aprobacionAnteproyectos) == true) {
				throw new ZMessManager().new DeletingException(
						"aprobacionAnteproyectos");
			}

			documentosProyectos = XMLHibernateDaoFactory.getInstance()
					.getDocumentosProyectoDAO().findByProperty(
							"proyecto.proCodigo", proCodigo);

			if (Utilities.validationsList(documentosProyectos) == true) {
				throw new ZMessManager().new DeletingException(
						"documentosProyectos");
			}

			proyectoPersonaRols = XMLHibernateDaoFactory.getInstance()
					.getProyectoPersonaRolDAO().findByProperty(
							"proyecto.proCodigo", proCodigo);

			if (Utilities.validationsList(proyectoPersonaRols) == true) {
				throw new ZMessManager().new DeletingException(
						"proyectoPersonaRols");
			}

			reciboProyectoGrados = XMLHibernateDaoFactory.getInstance()
					.getReciboProyectoGradoDAO().findByProperty(
							"proyecto.proCodigo", proCodigo);

			if (Utilities.validationsList(reciboProyectoGrados) == true) {
				throw new ZMessManager().new DeletingException(
						"reciboProyectoGrados");
			}

			revisionProyectoGrados = XMLHibernateDaoFactory.getInstance()
					.getRevisionProyectoGradoDAO().findByProperty(
							"proyecto.proCodigo", proCodigo);

			if (Utilities.validationsList(revisionProyectoGrados) == true) {
				throw new ZMessManager().new DeletingException(
						"revisionProyectoGrados");
			}

			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getProyectoDAO()
					.delete(entity);
			HibernateSessionFactory.commit();
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	public void updateProyecto2(Integer proCodigo, Date proFechafin,
			Date proFechainicio, String proNombre, String proTemaproyecto,
			List<PersonaDTO> integrantes, List<PersonaDTO> directores,
			Integer estCodigo, Integer faseCodigo, Integer tipo,
			Integer codigoProyecto, List<LineaInvestigacionDTO> linea)
			throws Exception {
		Proyecto entity = null;

		try {
			if (proCodigo == null) {
				throw new ZMessManager().new EmptyFieldException("Codigo");
			}

			if (proFechainicio == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Fecha de inicio");
			}

			if (proNombre == null) {
				throw new ZMessManager().new EmptyFieldException("Nombre");
			}

			if ((proNombre != null)
					&& (Utilities.checkWordAndCheckWithlength(proNombre, 80) == false)) {
				throw new ZMessManager().new NotValidFormatException("Nombre");
			}

			if (proTemaproyecto == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Tema proyecto");
			}
			if (estCodigo == null) {
				throw new ZMessManager().new EmptyFieldException("Estado");
			}
			if (faseCodigo == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Fase proyecto");
			}

			if ((proTemaproyecto != null)
					&& (Utilities.checkWordAndCheckWithlength(proTemaproyecto,
							200) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"Tema proyecto");
			}
			entity = getProyectoNombre(proNombre);
			if (entity == null) {
				throw new ZMessManager(ZMessManager.ENTITY_NOENTITYTOUPDATE);
			}
			Integer fase = entity.getFaseProyecto().getFasproCodigo();
			Integer estad = entity.getEstado().getEstCodigo();
			
			IEstadoLogic estadoLogic = new EstadoLogic();
			IFaseProyectoLogic faseProyectoLogic = new FaseProyectoLogic();
			ITipoProyectoLogic iTipoProyectoLogic = new TipoProyectoLogic();
			Estado estado = estadoLogic.getEstado(estCodigo);
			if (estado == null) {
				FacesUtils.addErrorMessage("El estado no existe");
			}
			FaseProyecto faseProyecto = faseProyectoLogic
					.getFaseProyecto(faseCodigo);
			if (faseProyecto == null) {
				FacesUtils.addErrorMessage("La fase Proyecto no existe");
			}
			TipoProyecto proyecto = iTipoProyectoLogic.getTipoProyecto(tipo);
			if (proyecto == null) {
				FacesUtils.addErrorMessage("El tipo proyecto no existe");
			}
			Proyecto proyecto4 = null;
			if (codigoProyecto != 0) {
				proyecto4 = getProyecto(codigoProyecto);
			}
			entity.setEstado(estado);
			entity.setFaseProyecto(faseProyecto);
			entity.setTipoProyecto(proyecto);
			entity.setProCodigo(entity.getProCodigo());
			entity.setProFechafin(proFechafin);
			entity.setProFechainicio(proFechainicio);
			entity.setProNombre(proNombre);
			entity.setProyecto(proyecto4);
			entity.setProTemaproyecto(proTemaproyecto);
			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getProyectoDAO()
					.update(entity);
			if (faseCodigo==3 && faseCodigo != fase){
				if (estCodigo != 6 && estad == 6 ){
					crearProyecto(entity,integrantes,directores,linea);
				}
			}
			//HibernateSessionFactory.flush();
			int rol2 = 4;
			entity = getProyectoNombre(proNombre);
			List<Persona> directores2 = getPersonasFromProyecto(rol2,entity.getProCodigo() );
			for (PersonaDTO personaDTO : directores) {
				boolean ingresar = true;
				for (Persona persona2 : directores2) {
					if (personaDTO.getPerCodigo().equals(
							persona2.getPerCodigo() + "")) {
						ingresar = false;
						break;
					}
				}
				if (ingresar == true) {
					IProyectoPersonaRolLogic logic = new ProyectoPersonaRolLogic();
					IPersonaLogic iPersonaLogic = new PersonaLogic();
					Persona persona = iPersonaLogic.getPersona(Integer
							.parseInt(personaDTO.getPerCodigo()));
					entity = getProyectoNombre(proNombre);
					IRolLogic logic2 = new RolLogic();
					Rol rol = logic2.getRol(rol2);
					ProyectoPersonaRolId idClass = new ProyectoPersonaRolId();
					idClass.setPerCodigo(persona.getPerCodigo());
					idClass.setRolCodigo(rol.getRolCodigo());
					idClass.setProCodigo(entity.getProCodigo());
					ProyectoPersonaRol entity2 = null;
					entity2 = logic.getProyectoPersonaRol(idClass);

					if (entity2 != null) {
						throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
					}

					entity2 = new ProyectoPersonaRol();
					entity2.setId(idClass);
					entity2.setPersona(persona);
					entity2.setProyecto(entity);
					entity2.setRol(rol);
					HibernateSessionFactory.beginTransaction();
					XMLHibernateDaoFactory.getInstance()
							.getProyectoPersonaRolDAO().save(entity2);
				}

			}
			for (Persona persona2 : directores2) {
				boolean remover = true;
				for (PersonaDTO personaDTO : directores) {
					if (personaDTO.getPerCodigo().equals(
							persona2.getPerCodigo() + "")) {
						remover = false;
						break;
					}
				}
				if (remover == true) {
					IProyectoPersonaRolLogic logic = new ProyectoPersonaRolLogic();
					entity = getProyectoNombre(proNombre);
					IRolLogic logic2 = new RolLogic();
					Rol rol = logic2.getRol(rol2);
					ProyectoPersonaRolId idClass = new ProyectoPersonaRolId();
					idClass.setPerCodigo(persona2.getPerCodigo());
					idClass.setRolCodigo(rol.getRolCodigo());
					idClass.setProCodigo(entity.getProCodigo());
					ProyectoPersonaRol entity2 = null;
					entity2 = logic.getProyectoPersonaRol(idClass);

					if (entity2 == null) {
						throw new ZMessManager(
								ZMessManager.ENTITY_NOENTITYTOUPDATE);
					}

					HibernateSessionFactory.beginTransaction();
					XMLHibernateDaoFactory.getInstance()
							.getProyectoPersonaRolDAO().delete(entity2);
				}

			}
			rol2 = 1;
			directores2 = getPersonasFromProyecto(rol2, entity.getProCodigo());
			for (PersonaDTO personaDTO : integrantes) {
				boolean ingresar = true;
				for (Persona persona2 : directores2) {
					if (personaDTO.getPerCodigo().equals(
							persona2.getPerCodigo() + "")) {
						ingresar = false;
						break;
					}
				}
				if (ingresar == true) {
					IProyectoPersonaRolLogic logic = new ProyectoPersonaRolLogic();
					IPersonaLogic iPersonaLogic = new PersonaLogic();
					Persona persona = iPersonaLogic.getPersona(Integer
							.parseInt(personaDTO.getPerCodigo()));
					entity = getProyectoNombre(proNombre);
					IRolLogic logic2 = new RolLogic();
					Rol rol = logic2.getRol(rol2);
					ProyectoPersonaRolId idClass = new ProyectoPersonaRolId();
					idClass.setPerCodigo(persona.getPerCodigo());
					idClass.setRolCodigo(rol.getRolCodigo());
					idClass.setProCodigo(entity.getProCodigo());
					ProyectoPersonaRol entity2 = null;
					entity2 = logic.getProyectoPersonaRol(idClass);

					if (entity2 != null) {
						throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
					}

					entity2 = new ProyectoPersonaRol();
					entity2.setId(idClass);
					entity2.setPersona(persona);
					entity2.setProyecto(entity);
					entity2.setRol(rol);
					HibernateSessionFactory.beginTransaction();
					XMLHibernateDaoFactory.getInstance()
							.getProyectoPersonaRolDAO().save(entity2);
				}

			}
			for (Persona persona2 : directores2) {
				boolean remover = true;
				for (PersonaDTO personaDTO : integrantes) {
					if (personaDTO.getPerCodigo().equals(
							persona2.getPerCodigo() + "")) {
						remover = false;
						break;
					}
				}
				if (remover == true) {
					IProyectoPersonaRolLogic logic = new ProyectoPersonaRolLogic();
					entity = getProyectoNombre(proNombre);
					IRolLogic logic2 = new RolLogic();
					Rol rol = logic2.getRol(rol2);
					ProyectoPersonaRolId idClass = new ProyectoPersonaRolId();
					idClass.setPerCodigo(persona2.getPerCodigo());
					idClass.setRolCodigo(rol.getRolCodigo());
					idClass.setProCodigo(entity.getProCodigo());
					ProyectoPersonaRol entity2 = null;
					entity2 = logic.getProyectoPersonaRol(idClass);

					if (entity2 == null) {
						throw new ZMessManager(
								ZMessManager.ENTITY_NOENTITYTOUPDATE);
					}

					HibernateSessionFactory.beginTransaction();
					XMLHibernateDaoFactory.getInstance()
							.getProyectoPersonaRolDAO().delete(entity2);
				}

			}
			List<LineaInvestigacion> linea2 = BusinessDelegatorView
					.getProyectoFromLinea(entity.getProCodigo());
			for (LineaInvestigacionDTO personaDTO : linea) {
				boolean ingresar = true;
				for (LineaInvestigacion lineaInvestigacion : linea2) {
					if (personaDTO.getLininCodigo().equals(
							lineaInvestigacion.getLininCodigo() + "")) {
						ingresar = false;
						break;
					}
				}
				if (ingresar == true) {
					IProyectoLineaLogic logic = new ProyectoLineaLogic();
					entity = getProyectoNombre(proNombre);
					LineaInvestigacion lineaInvestigacion = BusinessDelegatorView
							.getLineaInvestigacion(Integer.parseInt(personaDTO
									.getLininCodigo()));
					ProyectoLineaId idClass = new ProyectoLineaId();
					idClass.setProCodigo(entity.getProCodigo());
					idClass.setLininCodigo(lineaInvestigacion.getLininCodigo());
					ProyectoLinea entity2 = null;
					entity2 = logic.getProyectoLinea(idClass);

					if (entity2 != null) {
						throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
					}

					entity2 = new ProyectoLinea();
					entity2.setId(idClass);
					HibernateSessionFactory.beginTransaction();
					XMLHibernateDaoFactory.getInstance().getProyectoLineaDAO()
							.save(entity2);
				}

			}
			linea2 = BusinessDelegatorView.getProyectoFromLinea(entity.getProCodigo());
			for (LineaInvestigacion lineaInvestigacion : linea2) {
				boolean remover = true;
				for (LineaInvestigacionDTO personaDTO : linea) {
					if (personaDTO.getLininCodigo().equals(
							lineaInvestigacion.getLininCodigo() + "")) {
						remover = false;
						break;
					}
				}
				if (remover == true) {
					IProyectoLineaLogic logic = new ProyectoLineaLogic();
					entity = getProyectoNombre(proNombre);
					ProyectoLineaId idClass = new ProyectoLineaId();
					idClass.setProCodigo(entity.getProCodigo());
					idClass.setLininCodigo(lineaInvestigacion.getLininCodigo());
					ProyectoLinea entity2 = null;
					entity2 = logic.getProyectoLinea(idClass);

					if (entity2 == null) {
						throw new ZMessManager(
								ZMessManager.ENTITY_NOENTITYTOUPDATE);
					}

					HibernateSessionFactory.beginTransaction();
					XMLHibernateDaoFactory.getInstance().getProyectoLineaDAO()
							.delete(entity2);
				}
			}
			HibernateSessionFactory.commit();
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}

	}

	public void crearProyecto(Proyecto entity,List<PersonaDTO> integrantes,List<PersonaDTO> directores,List<LineaInvestigacionDTO> linea) throws Exception{
		Proyecto proyecto = new Proyecto();
		proyecto.setTipoProyecto(BusinessDelegatorView.getTipoProyecto(2));
		proyecto.setProTemaproyecto(entity.getProTemaproyecto());
		proyecto.setProFechafin(entity.getProFechafin());
		proyecto.setProFechainicio(entity.getProFechainicio());
		proyecto.setProyecto(entity);
		proyecto.setProNombre(entity.getProNombre()+" Proyecto");
		proyecto.setEstado(BusinessDelegatorView.getEstado(6));
		proyecto.setFaseProyecto(BusinessDelegatorView.getFaseProyecto(1));
		XMLHibernateDaoFactory.getInstance().getProyectoDAO().save(proyecto);
		HibernateSessionFactory.flush();
		for (PersonaDTO personaDTO : directores) {
			IProyectoPersonaRolLogic logic = new ProyectoPersonaRolLogic();
			IPersonaLogic iPersonaLogic = new PersonaLogic();
			Persona persona = iPersonaLogic.getPersona(Integer
					.parseInt(personaDTO.getPerCodigo()));
			entity = getProyectoNombre(proyecto.getProNombre());
			IRolLogic logic2 = new RolLogic();
			Rol rol = logic2.getRol(4);
			ProyectoPersonaRolId idClass = new ProyectoPersonaRolId();
			idClass.setPerCodigo(persona.getPerCodigo());
			idClass.setRolCodigo(rol.getRolCodigo());
			idClass.setProCodigo(entity.getProCodigo());
			ProyectoPersonaRol entity2 = null;
			entity2 = logic.getProyectoPersonaRol(idClass);

			if (entity2 != null) {
				throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
			}

			entity2 = new ProyectoPersonaRol();
			entity2.setId(idClass);
			entity2.setPersona(persona);
			entity2.setProyecto(entity);
			entity2.setRol(rol);
			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getProyectoPersonaRolDAO()
					.save(entity2);

		}
		for (PersonaDTO personaDTO : integrantes) {
			IProyectoPersonaRolLogic logic = new ProyectoPersonaRolLogic();
			IPersonaLogic iPersonaLogic = new PersonaLogic();
			Persona persona = iPersonaLogic.getPersona(Integer
					.parseInt(personaDTO.getPerCodigo()));
			entity = getProyectoNombre(proyecto.getProNombre());
			IRolLogic logic2 = new RolLogic();
			Rol rol = logic2.getRol(1);
			ProyectoPersonaRolId idClass = new ProyectoPersonaRolId();
			idClass.setPerCodigo(persona.getPerCodigo());
			idClass.setRolCodigo(rol.getRolCodigo());
			idClass.setProCodigo(entity.getProCodigo());
			ProyectoPersonaRol entity2 = null;
			entity2 = logic.getProyectoPersonaRol(idClass);

			if (entity2 != null) {
				throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
			}

			entity2 = new ProyectoPersonaRol();
			entity2.setId(idClass);
			entity2.setPersona(persona);
			entity2.setProyecto(entity);
			entity2.setRol(rol);
			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getProyectoPersonaRolDAO()
					.save(entity2);

		}
		for (LineaInvestigacionDTO lineaDTO : linea) {
			IProyectoLineaLogic lineaLogic = new ProyectoLineaLogic();
			ILineaInvestigacionLogic iPersonaLogic = new LineaInvestigacionLogic();
			LineaInvestigacion persona = iPersonaLogic
					.getLineaInvestigacion(Integer.parseInt(lineaDTO
							.getLininCodigo()));
			entity = getProyectoNombre(proyecto.getProNombre());
			ProyectoLineaId idClass = new ProyectoLineaId();
			idClass.setProCodigo(entity.getProCodigo());
			idClass.setLininCodigo(persona.getLininCodigo());
			ProyectoLinea entity2 = null;
			entity2 = lineaLogic.getProyectoLinea(idClass);

			if (entity2 != null) {
				throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
			}

			entity2 = new ProyectoLinea();
			entity2.setId(idClass);
			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getProyectoLineaDAO()
					.save(entity2);

		}
		
		
	}

	public void updateProyecto(Integer proCodigo, Date proFechafin,
			Date proFechainicio, String proNombre, String proTemaproyecto,
			Integer comCodigo_Comite, Integer estCodigo_Estado,
			Integer fasproCodigo_FaseProyecto, Integer tipproCodigo_TipoProyecto)
			throws Exception {
		Proyecto entity = null;

		try {
			if (proCodigo == null) {
				throw new ZMessManager().new EmptyFieldException("proCodigo");
			}

			if (proFechainicio == null) {
				throw new ZMessManager().new EmptyFieldException(
						"proFechainicio");
			}

			if (proNombre == null) {
				throw new ZMessManager().new EmptyFieldException("proNombre");
			}

			if ((proNombre != null)
					&& (Utilities.checkWordAndCheckWithlength(proNombre, 80) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"proNombre");
			}

			if (proTemaproyecto == null) {
				throw new ZMessManager().new EmptyFieldException(
						"proTemaproyecto");
			}

			if ((proTemaproyecto != null)
					&& (Utilities.checkWordAndCheckWithlength(proTemaproyecto,
							200) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"proTemaproyecto");
			}

			if (comCodigo_Comite == null) {
				throw new ZMessManager().new EmptyFieldException(
						"comCodigo_Comite");
			}

			if (estCodigo_Estado == null) {
				throw new ZMessManager().new EmptyFieldException(
						"estCodigo_Estado");
			}

			if (fasproCodigo_FaseProyecto == null) {
				throw new ZMessManager().new EmptyFieldException(
						"fasproCodigo_FaseProyecto");
			}

			if (tipproCodigo_TipoProyecto == null) {
				throw new ZMessManager().new EmptyFieldException(
						"tipproCodigo_TipoProyecto");
			}

			IComiteLogic logicComite1 = new ComiteLogic();

			IEstadoLogic logicEstado2 = new EstadoLogic();

			IFaseProyectoLogic logicFaseProyecto3 = new FaseProyectoLogic();

			ITipoProyectoLogic logicTipoProyecto4 = new TipoProyectoLogic();
			Comite comiteClass = logicComite1.getComite(comCodigo_Comite);
			Estado estadoClass = logicEstado2.getEstado(estCodigo_Estado);
			FaseProyecto faseProyectoClass = logicFaseProyecto3
					.getFaseProyecto(fasproCodigo_FaseProyecto);
			TipoProyecto tipoProyectoClass = logicTipoProyecto4
					.getTipoProyecto(tipproCodigo_TipoProyecto);

			if (comiteClass == null) {
				throw new ZMessManager().new ForeignException("comite");
			}

			if (estadoClass == null) {
				throw new ZMessManager().new ForeignException("estado");
			}

			if (faseProyectoClass == null) {
				throw new ZMessManager().new ForeignException("faseProyecto");
			}

			if (tipoProyectoClass == null) {
				throw new ZMessManager().new ForeignException("tipoProyecto");
			}

			entity = getProyecto(proCodigo);

			if (entity == null) {
				throw new ZMessManager(ZMessManager.ENTITY_NOENTITYTOUPDATE);
			}

			entity.setProCodigo(proCodigo);
			entity.setProFechafin(proFechafin);
			entity.setProFechainicio(proFechainicio);
			entity.setProNombre(proNombre);
			entity.setProTemaproyecto(proTemaproyecto);
			entity.setComite(comiteClass);
			entity.setEstado(estadoClass);
			entity.setFaseProyecto(faseProyectoClass);
			entity.setTipoProyecto(tipoProyectoClass);
			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getProyectoDAO()
					.update(entity);
			HibernateSessionFactory.commit();
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	public Proyecto getProyecto(Integer proCodigo) throws Exception {
		Proyecto entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getProyectoDAO()
					.findById(proCodigo);
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Proyecto");
		} finally {
		}

		return entity;
	}

	public List<Proyecto> findPageProyecto(String sortColumnName,
			boolean sortAscending, int startRow, int maxResults)
			throws Exception {
		List<Proyecto> entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getProyectoDAO()
					.findPageProyecto(sortColumnName, sortAscending, startRow,
							maxResults);
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Proyecto");
		} finally {
		}

		return entity;
	}

	public Long findTotalNumberProyecto() throws Exception {
		Long entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getProyectoDAO()
					.findTotalNumberProyecto();
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Proyecto Count");
		} finally {
		}

		return entity;
	}

	/**
	 * 
	 * @param varibles
	 *            este arreglo debera tener:
	 * 
	 *            [0] = String variable = (String) varibles[i]; representa como
	 *            se llama la variable en el pojo
	 * 
	 *            [1] = Boolean booVariable = (Boolean) varibles[i + 1];
	 *            representa si el valor necesita o no ''(comillas simples)usado
	 *            para campos de tipo string
	 * 
	 *            [2] = Object value = varibles[i + 2]; representa el valor que
	 *            se va a buscar en la BD
	 * 
	 *            [3] = String comparator = (String) varibles[i + 3]; representa
	 *            que tipo de busqueda voy a hacer.., ejemplo: where
	 *            nombre=william o where nombre<>william, en este campo iria el
	 *            tipo de comparador que quiero si es = o <>
	 * 
	 *            Se itera de 4 en 4..., entonces 4 registros del arreglo
	 *            representan 1 busqueda en un campo, si se ponen mas pues el
	 *            continuara buscando en lo que se le ingresen en los otros 4
	 * 
	 * 
	 * @param variablesBetween
	 * 
	 *            la diferencia son estas dos posiciones
	 * 
	 *            [0] = String variable = (String) varibles[j]; la variable ne
	 *            la BD que va a ser buscada en un rango
	 * 
	 *            [1] = Object value = varibles[j + 1]; valor 1 para buscar en
	 *            un rango
	 * 
	 *            [2] = Object value2 = varibles[j + 2]; valor 2 para buscar en
	 *            un rango ejempolo: a > 1 and a < 5 --> 1 seria value y 5 seria
	 *            value2
	 * 
	 *            [3] = String comparator1 = (String) varibles[j + 3];
	 *            comparador 1 ejemplo: a comparator1 1 and a < 5
	 * 
	 *            [4] = String comparator2 = (String) varibles[j + 4];
	 *            comparador 2 ejemplo: a comparador1>1 and a comparador2<5 (el
	 *            original: a > 1 and a < 5) *
	 * @param variablesBetweenDates
	 *            (en este caso solo para mysql) [0] = String variable =
	 *            (String) varibles[k]; el nombre de la variable que hace
	 *            referencia a una fecha
	 * 
	 *            [1] = Object object1 = varibles[k + 2]; fecha 1 a
	 *            comparar(deben ser dates)
	 * 
	 *            [2] = Object object2 = varibles[k + 3]; fecha 2 a
	 *            comparar(deben ser dates)
	 * 
	 *            esto hace un between entre las dos fechas.
	 * 
	 * @return lista con los objetos que se necesiten
	 * @throws Exception
	 */
	public List<Proyecto> findByCriteria(Object[] variables,
			Object[] variablesBetween, Object[] variablesBetweenDates)
			throws Exception {
		List<Proyecto> list = new ArrayList<Proyecto>();
		String where = new String();
		String tempWhere = new String();

		if (variables != null) {
			for (int i = 0; i < variables.length; i++) {
				if ((variables[i] != null) && (variables[i + 1] != null)
						&& (variables[i + 2] != null)
						&& (variables[i + 3] != null)) {
					String variable = (String) variables[i];
					Boolean booVariable = (Boolean) variables[i + 1];
					Object value = variables[i + 2];
					String comparator = (String) variables[i + 3];

					if (booVariable.booleanValue()) {
						tempWhere = (tempWhere.length() == 0) ? ("(model."
								+ variable + " " + comparator + " \'" + value + "\' )")
								: (tempWhere + " AND (model." + variable + " "
										+ comparator + " \'" + value + "\' )");
					} else {
						tempWhere = (tempWhere.length() == 0) ? ("(model."
								+ variable + " " + comparator + " " + value + " )")
								: (tempWhere + " AND (model." + variable + " "
										+ comparator + " " + value + " )");
					}
				}

				i = i + 3;
			}
		}

		if (variablesBetween != null) {
			for (int j = 0; j < variablesBetween.length; j++) {
				if ((variablesBetween[j] != null)
						&& (variablesBetween[j + 1] != null)
						&& (variablesBetween[j + 2] != null)
						&& (variablesBetween[j + 3] != null)
						&& (variablesBetween[j + 4] != null)) {
					String variable = (String) variablesBetween[j];
					Object value = variablesBetween[j + 1];
					Object value2 = variablesBetween[j + 2];
					String comparator1 = (String) variablesBetween[j + 3];
					String comparator2 = (String) variablesBetween[j + 4];
					tempWhere = (tempWhere.length() == 0) ? ("(" + value + " "
							+ comparator1 + " " + variable + " and " + variable
							+ " " + comparator2 + " " + value2 + " )")
							: (tempWhere + " AND (" + value + " " + comparator1
									+ " " + variable + " and " + variable + " "
									+ comparator2 + " " + value2 + " )");
				}

				j = j + 4;
			}
		}

		if (variablesBetweenDates != null) {
			for (int k = 0; k < variablesBetweenDates.length; k++) {
				if ((variablesBetweenDates[k] != null)
						&& (variablesBetweenDates[k + 1] != null)
						&& (variablesBetweenDates[k + 2] != null)) {
					String variable = (String) variablesBetweenDates[k];
					Object object1 = variablesBetweenDates[k + 1];
					Object object2 = variablesBetweenDates[k + 2];
					String value = null;
					String value2 = null;

					try {
						Date date1 = (Date) object1;
						Date date2 = (Date) object2;
						value = Utilities
								.formatDateWithoutTimeInAStringForBetweenWhere(date1);
						value2 = Utilities
								.formatDateWithoutTimeInAStringForBetweenWhere(date2);
					} catch (Exception e) {
						list = null;
						throw e;
					}

					tempWhere = (tempWhere.length() == 0) ? ("(model."
							+ variable + " between \'" + value + "\' and \'"
							+ value2 + "\')") : (tempWhere + " AND (model."
							+ variable + " between \'" + value + "\' and \'"
							+ value2 + "\')");
				}

				k = k + 2;
			}
		}

		if (tempWhere.length() == 0) {
			where = null;
		} else {
			where = "(" + tempWhere + ")";
		}

		try {
			list = XMLHibernateDaoFactory.getInstance().getProyectoDAO()
					.findByCriteria(where);
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} finally {
		}

		return list;
	}

	public List<Persona> getPersonasFromProyecto(Integer rol, Integer proCodigo)
			throws Exception {
		List<Persona> entity = null;

		try {
			if (rol != null && rol != 0 && proCodigo != null && proCodigo != 0) {
				entity = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
						.getPersonasFromProyecto(rol, proCodigo);
			}
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Persona");
		} finally {
		}

		return entity;
	}

	public List<Proyecto> getAllAntepro() throws Exception {
		List<Proyecto> entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getProyectoDAO()
					.findAllAntepro();
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Proyecto");
		} finally {
		}

		return entity;
	}

	public List<Proyecto> findProyecto(String string, String consulta)
			throws Exception {
		List<Proyecto> entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getProyectoDAO()
					.findProyecto(string, consulta);
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Proyecto");
		} finally {
		}

		return entity;
	}

	/*public void enviarCorreos(Integer cantSemanas)throws Exception {
		try {
		
			List<ProyectoPersonaRol> allProyectoPersonaRolEstudiantes=XMLHibernateDaoFactory.getInstance().getProyectoPersonaRolDAO().findByProperty("rol.rolCodigo", 1);
			List<ProyectoPersonaRol> allProyectoPersonaRolDirectores=XMLHibernateDaoFactory.getInstance().getProyectoPersonaRolDAO().findByProperty("rol.rolCodigo", 4);
			// lista de estudiantes  y directores con proyectos que no tienen actas
			List<Persona> personaEmail= new ArrayList<Persona>();
			
			for (int i = 0; i < allProyectoPersonaRolEstudiantes.size(); i++) {
				
				List<ActaSeguimientoProyectoGrado> actasProyecto= XMLHibernateDaoFactory.getInstance().getActaSeguimientoProyectoGradoDAO().findAll();
				
			}
			
			
			for (int i = 0; i < allProyectoPersonaRolDirectores.size(); i++) {
				
				List<ActaSeguimientoProyectoGrado> actasProyecto= XMLHibernateDaoFactory.getInstance().getActaSeguimientoProyectoGradoDAO().findAll();
				
			}
			
			
			
			
		} catch (Exception e) {
		
		}
		
	}*/
	


	public Proyecto getProyectoNombre(String proNombre) throws Exception {
		Proyecto entity = null;

		try {
			List<Proyecto> entity2 = XMLHibernateDaoFactory.getInstance()
					.getProyectoDAO().findByProperty("proNombre", proNombre);
			System.out.println(entity2.size());
			if (entity2.size()>0) {
				entity = entity2.get(0);
			}
		} catch (Exception e) {
			throw e;
		} finally {
		}

		return entity;
	}

}